package thread;

/**
 * 互斥锁:
 * 使用多个synchronized锁定多个代码片段，而指定的同步监视器是同一个时，这些代码片段之间就是互斥的。
 * 即:多个线程不能同时执行这些代码片段.
 */
public class SyncDemo4 {
    public static void main(String[] args) {
        /** 互斥锁: 指定的同步监视器(this)是同一个时,这些代码片段之间就是互斥的。*/
        Foo f = new Foo();
//        Foo f1 = new Foo();
        /*
            用同一个对象的方法，是相同的this，而方法synchronized修饰,
            则发生互斥现象.
         */
        Thread a = new Thread() {
            public void run() {
                f.methodA();
            }
        };
        Thread b = new Thread() {
            public void run() {
                f.methodB();
            }
        };
        a.start();
        b.start();
    }
}
class Foo {
    public synchronized void methodA() {
        try {
            Thread t = Thread.currentThread();
            System.out.println(t.getName() + ":正在执行A方法...");
            Thread.sleep(5000);
            System.out.println(t.getName() + ":A方法执行完毕!");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    public synchronized void methodB() {

        try {
            Thread t = Thread.currentThread();
            System.out.println(t.getName() + ":正在执行B方法...");
            Thread.sleep(5000);
            System.out.println(t.getName() + ":B方法执行完毕！");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}